唉呀,今天再一篇v-for,不知道v-for分兩篇會不會覺得太灌水,但我還是分兩篇了✧*。٩(ˊᗜˋ*)و✧*。
當Vue正在更新使用v-for渲染的元素列表時,它會默認使用就地更新的策略。v-for 上所渲染的資料若是更動順序,DOM元素在渲染時,並不會隨便順序更動,而是就地更新每個元素,並確保他們在每個索引位置正確渲染,這樣的渲染方式若用於元素單純的狀態下其實是高效的。
這時候加上 key 屬性就可以解決這個問題!它可以讓 vue 有個依據來辨識每個節點。
拿前一天的兩個範例來說明!
我們在v-for後面用v-bind去綁定一個key屬性,key記得要綁定唯一的值!
<ul>
    <li v-for="(item,index) in array" :key="index">
        {{index+1}}. {{cute}}{{ item.pet }}
    </li>
</ul>
<ul>
    <li v-for="(value,name,index) in object" :key="name">
        {{index+1}}.{{name}}:{{value}}
    </li>
</ul>
再度提醒
v-bind的縮寫是:歐( ~'ω')~
v-for 除了我們昨天講到的array及object的渲染方式,它還有一個特殊的渲染方式,可以用整數做渲染,它會把模板重複對應次數。
像是n in 10 ,n表示目前所在數字,而10表示範圍定義。
<ul>
    <li v-for="n in 10">{{n}}</li>
</ul>

當我們想要呈現過濾後或排序後的數據,卻不想變更或重置原始數據,這時候我們就可以用到之前講過的計算屬性computed來返回過濾後的數據了ε٩(๑> ₃ <)۶з
<div id="app">
    <ul>
        <li v-for="n in evenNumbers">{{ n }}</li>
    </ul>
</div>
<script>
    var vm = new Vue({
        el: '#app',
        data: {
            numbers: [1, 2, 3, 4, 5]
        },
        computed: {
            evenNumbers: function () {
                return this.numbers.filter(function (number) {
                    return number % 2 === 0
                })
            }
        }
    });
</script>
結果就只會顯示是偶數的2、4。
使用計算屬性可以解決大部分的需求,但如果資料有用到巢狀 v-for 的話,就沒辦法用計算屬性了,這時候我們可以改用方法methods來達成需求╰(°▽°)╯
<div id="app">
    <ul v-for="set in sets">
        <li v-for="n in even(set)">{{ n }}</li>
    </ul>
</div>
<script>
    var vm = new Vue({
        el: '#app',
        data: {
            sets: [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]]
        },
        methods: {
            even: function (numbers) {
                return numbers.filter(function (number) {
                    return number % 2 === 0
                })
            }
        }
    });
</script>

<template> 上使用 v-for跟v-if相同,v-for也可以使用 <template> 一次渲染多個元素:
在這邊,index、name用一個<li>渲染,而value用不同的<li>渲染。
<div id="app">
        <ul>
            <template v-for="(value,name,index) in object">
                <li>{{index+1}}.{{name}}</li>
                <li>{{value}}</li>
            </template>
        </ul>
    </div>
    <script>
        var vm = new Vue({
            el: '#app',
            data: {
                object: {
                    title: '菜鳥學前端,一起Vue起來!',
                    theme: 'Modern Web',
                    start: '2021.09.13'
                }
            },
        });
    </script>

當他們在同一個節點的時候,v-for的優先級比 v-if 更高,所以v-if將分別重複執行在每個v-for的循環中。
<ul>
    <li v-for="(value,name,index) in object" v-if="index > 0">
        {{index+1}}.{{name}}:{{value}}
    </li>
</ul>
data: {
        object: {
            title: '菜鳥學前端,一起Vue起來!',
            theme: 'Modern Web',
            start: '2021.09.13'
        }
}
像這個例子,v-if每次渲染前會經過v-for,所以在這個例子它會執行三次,看起來就像:
<li v-if="index > 0"> {{index+1}}.{{name}}:{{value}}</li>
<li v-if="index > 0"> {{index+1}}.{{name}}:{{value}}</li>
<li v-if="index > 0"> {{index+1}}.{{name}}:{{value}}</li>
但判斷完後最後的結果只有兩個
<li>2.theme:Modern Web</li>
<li>3.start:2021.09.13</li>

所以如果我們的目的是想要有條件地跳過循環運行,我們可以把v-if放在外層元素或是<template> 上。
歐耶,v-for是真的講完了喇,明天又是個新開始!!大家要加油啊啊啊,遠距了好久終於要回學校了,終於可以看到認識的人類們ㄌヾ(´∀ ˋ)ノ
但要比較早起床有點累哈哈哈